<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>1、ECMAScript基础(深入)之数组基础</title>
</head>
<body>
    <script>
        /**
         * 在原数组上修改
         * push\pop\shift\unshift\reverse\splice\sort
         **/


        // 数组
        // var arr = [1, 2, 3, 4, 5]; // 数组字面量
        // var arr1 = new Array(); // 内置Array构造函数
        // var arr3 = Array(); // 不使用
        // console.log(arr3);
        // 所有数组都继承于Array.prototype

        // 对象
        // var obj1 = {}; // 对象字面量
        // var obj2 = new Object(); // 内置Object构造函数
        // var obj3 = Object(); // 不使用
        // 所有对象都继承于Object.prototype
        
        // console.log('-----分割线-----');

        // var arr = [1, 2, 3, 4, 5];
        // var obj = {
        //     0: 1,
        //     1: 2,
        //     2: 3,
        //     3: 4,
        //     4: 5
        // }
        
        // array 默认最后一位没值不会取
        // var arr = [,1, 2,]; // arr.length => 3
    
        // push unshift
        // 返回值，执行了方法之后的新的数组长度
        var arr = [2, 3, 4];
        var newLen = arr.push(5);
        console.log(newLen);

        // 自定义push方法
        Array.prototype.myPush = function(){
            for(var i = 0; i < arguments.length; i++){
                this[this.length] = arguments[i]
            }
            return this.length;
        }
        console.log(arr.myPush(1, 2, 3));
        console.log(arr);

        // pop shift
        // reverse 倒序
        arr.reverse()
        console.log(arr);
        console.log('-------分割线-------');

        // splice
        // arr.splice(index, len, newData)

        var arr1 = ['a', 'b', 'c'];
        arr1.splice(1, 1, 1,2,3);
        console.log(arr1);

        var arr2 = ['a', 'b', 'c', 'e'];
        arr2.splice(3, 0, 'd');
        console.log(arr2);

        // function splice(arr, index){
        //     return index += index >= 0 ? 0 : arr.length;
        // }
        console.log('-------分割线-------');

        // sort -> 按照ASCII码来排列的，尽量不要使用
        // sort(function(a, b){return ...})
        // 自定义排序：
        // 1、参数a, b;
        // 2、返回值：
        //          1、负值.a就排前面
        //          2、正值.b就排前面
        var arr3 = [27, 48, 5, 7];
        arr3.sort(function(a, b){
            // if(a > b) {
            //     return 1;
            // } else {
            //     return -1;
            // }
            return a - b;
        })
        console.log(arr3);
        console.log('-------分割线-------');

        // 随机排序
        var arr4 = [1, 2, 3, 4, 5, 6];
        // Math.random() -> 0 - 1;开区间
        arr4.sort(function(a, b){
            // var rand = Math.random();
            // if(rand - 0.5 > 0) {
            //     return 1;
            // } else {
            //     return -1;
            // }
            return Math.random() - 0.5;
        });
        console.log(arr4);
        
        console.log('-------分割线-------');
        var arr5 = [
            {son: 'Jenny', age: 18},
            {son: 'Jone', age: 10},
            {son: 'Ben', age: 16},
            {son: 'Crytal', age: 3},
            {son: 'Lucy', age: 11}
        ]

        arr5.sort(function(a, b){
            return a.age - b.age;
            // return b.age - a.age; // 倒序
        });

        console.log(arr5);
        console.log('-------分割线-------');

        var arr6 = ['12345', '1', '1234', '12', '1234567'];
        arr6.sort(function(a, b){
            return a.length - b.length;
        });
        console.log(arr6);
        console.log('-------分割线-------');
    </script>
</body>
</html>